/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package myftp.core;

import java.util.HashMap;
import javax.swing.JComponent;
import javax.swing.JFrame;
import myftp.core.controller.FrontController;
import myftp.core.view.AbstractView;

/**
 *
 * @author CAVARLE Glenn, LUCAS Stéphane
 *
 * classe singleton définissant le conteneur (JFrame) de l'interface graphique
 * (classe threadable)
 */
public class Template extends JFrame implements Runnable {

    /**
     * instance unique de Template
     * @var instance
     */
    private static Template instance;
    /**
     * la vue globale de l'application
     * @var mainView
     */
    private AbstractView mainView = null;
    /**
     * les différentes parties à insérer dans la mainView
     * @var viewParts
     */
    private HashMap<String, JComponent> viewParts;

    /**
     * constructeur privé
     */
    private Template() {
        super();
        this.viewParts = new HashMap();
    }

    /**
     * getter pour les ViewPart de l'application
     * @param partName
     * @return JComponent
     */
    public JComponent getViewPart(String partName) {
        if (!this.viewParts.containsKey(partName)) {
            return null;
        }
        return this.viewParts.get(partName);
    }

    /**
     * setter pour ajouter une ViewPart
     * @param partName
     * @param view
     */
    public void setViewPart(String partName, JComponent view) {
        this.viewParts.put(partName, view);
    }

    /**
     * retourne l'instance de Template
     * @return Template
     */
    public static Template getInstance() {

        if (instance == null) {
            instance = new Template();
        }
        return instance;
    }

    /**
     * retourne l'instance du Frontcontroller associé au Template
     * @return FrontController
     */
    FrontController getFrontController() {
        return FrontController.getInstance();
    }

    /**
     * lancement du thread général de la vue
     */
    public void startup() {
        new Thread(this).start();
    }

    /**
     * affichage de la JFrame
     */
    public void run() {
        this.getContentPane().add(this.mainView);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }

    /**
     * setter pour la mainView
     * @param view
     */
    public void setMainView(AbstractView view) {
        this.mainView = view.init();
    }
}
